home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / xxboot.c < prev   
C/C++ Source or Header  |  1990-12-19  |  3KB  |  158 lines

  1.  
  2. /*
  3.  * @(#)xxboot.c 1.1 86/09/27
  4.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  5.  */
  6.  
  7. /*
  8.  * General boot code for routines which implement the "standalone
  9.  * driver" boot interface.
  10.  */
  11.  
  12. #include "saio.h"
  13. #include "bootparam.h"
  14. #include "sunromvec.h"
  15.  
  16. extern char *devalloc();
  17. extern char *resalloc();
  18. extern int tftpboot();
  19.  
  20. int
  21. xxboot(bp)
  22.     register struct bootparam *bp;
  23. {
  24.     struct saioreq req;
  25.     int blkno;
  26.     char *addr;
  27.  
  28.     req.si_ctlr = bp->bp_ctlr;
  29.     req.si_unit = bp->bp_unit;
  30.     req.si_boff = (daddr_t)bp->bp_part;
  31.     req.si_boottab = bp->bp_boottab;
  32.  
  33.     if (devopen(&req))    /* Do all the hard work */
  34.         return -1;
  35.  
  36.     for (blkno = 1, addr = (char *)LOADADDR;
  37.          blkno <= BBSIZE/DEV_BSIZE;
  38.          blkno++, addr += DEV_BSIZE) {
  39.         req.si_bn = blkno;
  40.         req.si_cc = DEV_BSIZE;
  41.         req.si_ma = addr;
  42.         if (req.si_cc != (*bp->bp_boottab->b_strategy)(&req, READ))
  43.             return -1;
  44.     }
  45.     return LOADADDR;
  46. }
  47.  
  48. int
  49. devopen(sip)
  50.     register struct saioreq *sip;
  51. {
  52.     register struct devinfo *dp;
  53.     char *a;
  54.     static  struct    saif sa;
  55.     char buf[32];
  56.  
  57.     romp->v_printf("v_open = %d\n", romp->v_open("le0"));
  58.     romp->v_printf("xmit = %d\n", romp->v_xmit_packet(0, buf, 32));
  59.  
  60.     sip->si_devaddr = sip->si_devdata = sip->si_dmaaddr = (char *)0;
  61.     dp = sip->si_boottab->b_devinfo;
  62.     if (dp) {
  63.         /* Map controller number into controller address */
  64.         if (sip->si_ctlr < dp->d_stdcount) {
  65.             sip->si_ctlr = (int)((dp->d_stdaddrs)[sip->si_ctlr]);
  66.         }
  67.         /* Map in device itself */
  68.         if (dp->d_devbytes) {
  69.             a = devalloc(dp->d_devtype, sip->si_ctlr,
  70.                 dp->d_devbytes);
  71.             if (!a)
  72.                 return (-1);
  73.             sip->si_devaddr = a;
  74.         }
  75.         if (dp->d_dmabytes) {
  76.             a = resalloc(RES_DMAMEM, dp->d_dmabytes);
  77.             if (!a) 
  78.                 return (-1);
  79.             sip->si_dmaaddr = a;
  80.         }
  81.         if (dp->d_localbytes) {
  82.             a = resalloc(RES_MAINMEM, dp->d_localbytes);
  83.             if (!a) 
  84.                 return (-1);
  85.             sip->si_devdata = a;
  86.         }
  87.     }
  88.     return 0;
  89.     return ((sip->si_boottab->b_open)(sip));
  90. }
  91.  
  92. /*
  93.  * Close device, release resources.
  94.  * FIXME, prom HAS no resources!!!
  95.  */
  96. int
  97. devclose(sip)
  98.     struct saioreq *sip;
  99. {
  100.     return ((*sip->si_boottab->b_close)(sip));
  101. }
  102.  
  103. int
  104. ttboot(bp)
  105.         register struct bootparam *bp;
  106. {
  107.         struct saioreq req;
  108.         int blkno;
  109.     register int len;
  110.         char *addr;
  111.     register int result = -1;
  112.  
  113.         req.si_ctlr = bp->bp_ctlr;
  114.         req.si_unit = bp->bp_unit;
  115.         req.si_boff = (daddr_t)bp->bp_part;
  116.     req.si_boottab = bp->bp_boottab;
  117.  
  118.         if (devopen(&req))      /* Do all the hard work */
  119.                 return -1;
  120.  
  121.         for (blkno = 1, addr = (char *)LOADADDR;; blkno++, addr += len) {
  122.                 req.si_bn = blkno;
  123.                 req.si_cc = 32768;
  124.                 req.si_ma = addr;
  125.         len = (*bp->bp_boottab->b_strategy)(&req, READ);
  126.         if (len == 0) {
  127.             if (blkno != 1)
  128.                 result = LOADADDR;
  129.             break;
  130.         }
  131.         }
  132.     (*bp->bp_boottab->b_close)(&req);
  133.         return result;
  134. }
  135.  
  136. int
  137. tftpboot(bp)
  138.         register struct bootparam *bp;
  139. {
  140.         struct saioreq req;
  141.         int blkno;
  142.         char *addr;
  143.  
  144.         req.si_ctlr = bp->bp_ctlr;
  145.         req.si_unit = bp->bp_unit;
  146.         req.si_boff = (daddr_t)bp->bp_part;
  147.         req.si_boottab = bp->bp_boottab;
  148.  
  149.         if (devopen(&req))      /* Do all the hard work */
  150.                 return -1;
  151.  
  152.     if (tftpload(&req) == -1){
  153.         return(-1);
  154.     } else {
  155.         return LOADADDR;
  156.     }
  157. }
  158.